與傳統(tǒng)的基于云或以服務(wù)器為中心的基礎(chǔ)架構(gòu)相比,無服務(wù)器計(jì)算具有許多優(yōu)勢(shì)。對(duì)于許多開發(fā)人員而言,無服務(wù)器架構(gòu)以更低的成本提供了更大的可擴(kuò)展性、更大的靈活性和更快的發(fā)布時(shí)間。使用無服務(wù)器架構(gòu),開發(fā)人員無需擔(dān)心購(gòu)買、配置和管理后端服務(wù)器。然而,無服務(wù)器計(jì)算并不是所有 Web 應(yīng)用程序開發(fā)人員的靈丹妙藥。
無服務(wù)器計(jì)算如何工作?
無服務(wù)器計(jì)算是一種架構(gòu),其中供應(yīng)商根據(jù)需要提供后端服務(wù)。要了解有關(guān)無服務(wù)器計(jì)算的更多信息,請(qǐng)參閱什么是無服務(wù)器計(jì)算?
無服務(wù)器計(jì)算的優(yōu)勢(shì)是什么?
無需服務(wù)器管理
盡管“無服務(wù)器”計(jì)算確實(shí)發(fā)生在服務(wù)器上,但開發(fā)人員永遠(yuǎn)不必處理服務(wù)器。它們由供應(yīng)商管理。這可以減少 DevOps 所需的投資,從而降低開支,還可以讓開發(fā)人員騰出時(shí)間來創(chuàng)建和擴(kuò)展他們的應(yīng)用程序,而不受服務(wù)器容量的限制。
開發(fā)人員只需為其使用的服務(wù)器空間付費(fèi),從而降低成本
與“即用即付”電話計(jì)劃一樣,開發(fā)人員只需為他們使用的內(nèi)容付費(fèi)。代碼僅在無服務(wù)器應(yīng)用程序需要后端功能時(shí)運(yùn)行,并且代碼會(huì)根據(jù)需要自動(dòng)擴(kuò)展。配置是動(dòng)態(tài)的、精確的和實(shí)時(shí)的。有些服務(wù)非常精確,以至于它們將費(fèi)用分解為 100 毫秒的增量。相比之下,在傳統(tǒng)的“全服務(wù)器”架構(gòu)中,開發(fā)人員必須提前預(yù)測(cè)他們需要多少服務(wù)器容量,然后購(gòu)買該容量,無論他們最終是否使用它。
無服務(wù)器架構(gòu)本質(zhì)上是可擴(kuò)展的
想象一下,如果郵局能夠以某種方式神奇地隨意添加和停用送貨卡車,隨著郵件數(shù)量的激增(例如,就在母親節(jié)之前)增加其車隊(duì)的規(guī)模,并在需要較少交付的時(shí)候減少其車隊(duì)。這基本上是無服務(wù)器應(yīng)用程序能夠做到的。
使用無服務(wù)器基礎(chǔ)架構(gòu)構(gòu)建的應(yīng)用程序?qū)㈦S著用戶群的增長(zhǎng)或使用量的增加而自動(dòng)擴(kuò)展。如果一個(gè)功能需要在多個(gè)實(shí)例中運(yùn)行,供應(yīng)商的服務(wù)器將根據(jù)需要啟動(dòng)、運(yùn)行和結(jié)束它們,通常使用容器。(如果最近運(yùn)行該函數(shù),它將更快地啟動(dòng) - 請(qǐng)參閱下面的“性能可能會(huì)受到影響”。)因此,無服務(wù)器應(yīng)用程序?qū)⒛軌蛱幚懋惓4罅康恼?qǐng)求,就像它可以處理一樣來自單個(gè)用戶的單個(gè)請(qǐng)求。具有固定數(shù)量服務(wù)器空間的傳統(tǒng)結(jié)構(gòu)化應(yīng)用程序可能會(huì)因使用量的突然增加而不堪重負(fù)。
可以進(jìn)行快速部署和更新
使用無服務(wù)器基礎(chǔ)架構(gòu),無需將代碼上傳到服務(wù)器或進(jìn)行任何后端配置即可發(fā)布應(yīng)用程序的工作版本。開發(fā)人員可以非常快速地上傳一些代碼并發(fā)布新產(chǎn)品。他們可以一次上傳全部代碼或一次上傳一個(gè)函數(shù),因?yàn)閼?yīng)用程序不是一個(gè)單一的整體堆棧,而是供應(yīng)商提供的一組函數(shù)。這也使得快速更新、修補(bǔ)、修復(fù)或向應(yīng)用程序添加新功能成為可能。無需對(duì)整個(gè)應(yīng)用程序進(jìn)行更改;相反,開發(fā)人員可以一次更新應(yīng)用程序一項(xiàng)功能。
代碼可以更靠近最終用戶運(yùn)行,從而減少延遲
因?yàn)閼?yīng)用程序不是托管在源服務(wù)器上,所以它的代碼可以在任何地方運(yùn)行。因此,根據(jù)所使用的供應(yīng)商,可以在靠近最終用戶的服務(wù)器上運(yùn)行應(yīng)用程序功能。這減少了延遲,因?yàn)閬碜杂脩舻恼?qǐng)求不再需要一路傳送到源服務(wù)器。
無服務(wù)器計(jì)算的缺點(diǎn)是什么?
測(cè)試和調(diào)試變得更具挑戰(zhàn)性
很難復(fù)制無服務(wù)器環(huán)境以查看代碼在部署后的實(shí)際執(zhí)行情況。調(diào)試更加復(fù)雜,因?yàn)殚_發(fā)人員無法看到后端進(jìn)程,并且因?yàn)閼?yīng)用程序被分解為單獨(dú)的、更小的功能。
無服務(wù)器計(jì)算引入了新的安全問題
當(dāng)供應(yīng)商運(yùn)行整個(gè)后端時(shí),可能無法完全檢查他們的安全性,這對(duì)于處理個(gè)人或敏感數(shù)據(jù)的應(yīng)用程序來說尤其是一個(gè)問題。由于公司沒有分配到自己的離散物理服務(wù)器,因此無服務(wù)器提供商通常會(huì)在任何給定時(shí)間在單個(gè)服務(wù)器上運(yùn)行來自多個(gè)客戶的代碼。這種與其他方共享機(jī)器的問題被稱為“多租戶”——想想幾家公司試圖同時(shí)在一個(gè)辦公室租賃和工作。多租戶會(huì)影響應(yīng)用程序性能,如果多租戶服務(wù)器配置不正確,可能會(huì)導(dǎo)致數(shù)據(jù)泄露。多租戶對(duì)沙盒功能正常且基礎(chǔ)設(shè)施足夠強(qiáng)大的網(wǎng)絡(luò)幾乎沒有影響。
無服務(wù)器架構(gòu)不是為長(zhǎng)時(shí)間運(yùn)行的進(jìn)程構(gòu)建的
這限制了可以在無服務(wù)器架構(gòu)中經(jīng)濟(jì)高效地運(yùn)行的應(yīng)用程序種類。由于無服務(wù)器提供商對(duì)代碼運(yùn)行的時(shí)間量收費(fèi),因此與傳統(tǒng)基礎(chǔ)架構(gòu)相比,在無服務(wù)器基礎(chǔ)架構(gòu)中運(yùn)行具有長(zhǎng)時(shí)間運(yùn)行進(jìn)程的應(yīng)用程序的成本可能更高。
性能可能會(huì)受到影響
因?yàn)樗皇浅掷m(xù)運(yùn)行的,所以無服務(wù)器代碼在使用時(shí)可能需要“啟動(dòng)”。此啟動(dòng)時(shí)間可能會(huì)降低性能。但是,如果定期使用一段代碼,無服務(wù)器提供程序?qū)⒈3炙鼫?zhǔn)備好被激活——對(duì)這個(gè)現(xiàn)成代碼的請(qǐng)求稱為“熱啟動(dòng)”。對(duì)一段時(shí)間未使用的代碼的請(qǐng)求稱為“冷啟動(dòng)”。Workers 通過使用 Chrome V8 引擎在很大程度上避免了冷啟動(dòng)問題,該引擎在大多數(shù)情況下能夠在 5 毫秒內(nèi)啟動(dòng)和運(yùn)行 JavaScript 代碼。如果代碼已經(jīng)在運(yùn)行,則響應(yīng)時(shí)間不到一毫秒。詳細(xì)了解不同無服務(wù)器平臺(tái)的性能。
供應(yīng)商鎖定是一種風(fēng)險(xiǎn)
允許供應(yīng)商為應(yīng)用程序提供所有后端服務(wù)不可避免地會(huì)增加對(duì)該供應(yīng)商的依賴。與一個(gè)供應(yīng)商建立無服務(wù)器架構(gòu)可能會(huì)使必要時(shí)難以切換供應(yīng)商,特別是因?yàn)槊總€(gè)供應(yīng)商提供的功能和工作流程略有不同。
誰應(yīng)該使用無服務(wù)器架構(gòu)?
想要縮短上市時(shí)間并構(gòu)建可快速擴(kuò)展或更新的輕量級(jí)、靈活應(yīng)用程序的開發(fā)人員可能會(huì)從無服務(wù)器計(jì)算中受益匪淺。無服務(wù)器架構(gòu)將降低使用不一致的應(yīng)用程序的成本,高峰期與幾乎沒有流量的時(shí)間交替出現(xiàn)。對(duì)于此類應(yīng)用程序,購(gòu)買持續(xù)運(yùn)行且始終可用(即使未使用)的服務(wù)器或服務(wù)器塊可能是對(duì)資源的浪費(fèi)。無服務(wù)器設(shè)置將在需要時(shí)立即響應(yīng),并且在靜止時(shí)不會(huì)產(chǎn)生成本。此外,想要將部分或全部應(yīng)用程序功能推送到靠近最終用戶以減少延遲的開發(fā)人員將需要至少部分無服務(wù)器架構(gòu),因?yàn)檫@樣做需要將一些進(jìn)程移出源服務(wù)器。
開發(fā)人員何時(shí)應(yīng)避免使用無服務(wù)器架構(gòu)?
在某些情況下,無論從成本角度還是從系統(tǒng)架構(gòu)角度來看,使用自我管理或作為服務(wù)提供的專用服務(wù)器都更有意義。例如,具有相當(dāng)穩(wěn)定、可預(yù)測(cè)的工作負(fù)載的大型應(yīng)用程序可能需要傳統(tǒng)設(shè)置,在這種情況下,傳統(tǒng)設(shè)置可能更便宜。此外,將遺留應(yīng)用程序遷移到具有完全不同架構(gòu)的新基礎(chǔ)架構(gòu)可能非常困難。